package com.qkjia.config;

import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.extension.parsers.BlockAttackSqlParser;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.plugins.SqlExplainInterceptor;
import com.qkjia.Injector.MySqlInjector;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zhaoqiankun
 * @date 2021/12/2
 *         分页拦截器对象
 */
@Configuration//配置类
@MapperScan("com.qkjia.mapper")// 设置mapper包扫描
public class MybatisPlusConfig {

    /**
     * 分页插件
     * 注释sqlMapConfig.xml 有通过mybatis添加的分页插件
     */
    /*   @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }*/


    /*
      性能分析插件
    */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        // 设置sql语句的最大执行时间 单位ms
        performanceInterceptor.setMaxTime(1000);
        // 设置sql是否格式化显示
        performanceInterceptor.setFormat(true);
        // 是否写入日志
        performanceInterceptor.setWriteInLog(false);
        // 从配置文件拿到属性
//        performanceInterceptor.setProperties();
        return performanceInterceptor;
    }

    /**
     * 执行分析插件
     * 在MP中提供了对SQL执⾏的分析的插件，可⽤作阻断全表更新、删除的操作，
     * 注意：该插件仅适⽤于开发环境，
     * 不适⽤于⽣产环境。
     */
    @Bean
    public SqlExplainInterceptor sqlExplainInterceptor() {
        SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();

        // 解析SQL对象ISqlParser
        List<ISqlParser> sqlParserList = new ArrayList<>();
        // 攻击 SQL 阻断解析器、加⼊解析链
        sqlParserList.add(new BlockAttackSqlParser());
        sqlExplainInterceptor.setSqlParserList(sqlParserList);
        return sqlExplainInterceptor;
    }

    /*
     *    乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {

        return new OptimisticLockerInterceptor();
    }

    /**
     * 自定义SQL注入器
     */
    @Bean
    public MySqlInjector mySqlInjector() {

        return new MySqlInjector();
    }

}
